package com.xavier.dong.netty.inboundhandlerandoutboundhandler;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author XavierDong
 **/
public class MyByteToLongDecoder extends ByteToMessageDecoder {


    /**
     * 会根据 接收到的数据  被调用多次
     * 直到 确认没有新的元素添加到 list 中 ，或者是 ByteBuf 没有更多的可读的 字节为止
     * <p>
     * 如果 list out 不为空， 就会将 List 传递 给 下一个 ChannelInBoundHandler 处理. 该 处理器的方法 也会被 调用多次
     *
     * @param ctx 上下文对象
     * @param in  入站的 Byte 对象
     * @param out List 集合，将解码后的数据 传递给 下一个 Handler
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

        System.out.println("MyByteToLongDecoder 被调用!");

        // 因为 Long 是 8个字节 , 需要 判断 有 8个字节 才能 读取 一个 Long
        if (in.readableBytes() >= 8)
            out.add(in.readLong());


    }
}
